// -----------------------------------------------
// Template GA: ctlRicerca.cs	rel: 3.0.1.0 NoDal
// -----------------------------------------------
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Text;
using System.Data;
using IGCal.Windows.ReaderControls;
using IGCal.GA;
using IGCal.Funzioni;
using IGCal.DB;
using IGCal.GA.BaseObjects;

namespace Calcio.DefaultDirigenti
{
	/// <summary>
	/// Controllo di ricerca 'ctlDefaultDirigentiRicerca'
	/// </summary>
	public partial class ctlDefaultDirigentiRicerca : ctlRicercaBase // , IGCal.Windows.Security.IDontSetFunction ******** Scommentare per la security ********
	{

		#region Costruttore della classe

		/// <summary>
		/// Costruttore di 'ctlDefaultDirigentiRicerca'
		/// </summary>
		public ctlDefaultDirigentiRicerca()
		{
			// This call is required by the Windows Form Designer.
			InitializeComponent();

			// TODO: Add any initialization after the InitializeComponent call
			Initialize();
		}

		#endregion

		/// <summary>
		/// Lanciata subito dopo la creazione dei componenti, si occupa di inizializzare il controllo definendone la
		/// query su cui lavorare e caricando nella lista le colonne che compariranno.
		/// </summary>
		protected void Initialize()
		{
			LegaProcedureAEventi();

			base.Initialize(ctlFiltro.GetSelect(), ctlFiltro.GetQuerySuffix(), Globals.Connection);
		}


		#region Legami delle procedure evento agli eventi dei controlli

		private void LegaProcedureAEventi()
		{
			// Per i pulsanti
			this.btnRicerca.Click += new System.EventHandler(this.btnRicerca_OnClick);
			this.ctlFiltro.ButtonPulisciClick += new System.EventHandler(this.btnPulisci_OnClick);
		}

		#endregion


		#region Eventi dei controlli contenuti nello User Control

		/// <summary>
		/// Gestione dell'evento OnClick del pulsante btnPulisci
		/// </summary>
		/// <param name="sender">Oggetto inviante l'evento</param>
		/// <param name="e">Argomenti standard dell'evento</param>
		protected void btnPulisci_OnClick(object sender, EventArgs e)
		{
			ErrorProvider.SetError(btnRicerca, "");

			lvwRicerca.Items.Clear();

			SetNumeroElementiTrovati(lvwRicerca.Items.Count);
		}

		/// <summary>
		/// Gestione dell'evento OnClick del pulsante btnRicerca
		/// </summary>
		/// <param name="sender">Oggetto inviante l'evento</param>
		/// <param name="e">Argomenti standard dell'evento</param>
		protected void btnRicerca_OnClick(object sender, EventArgs e)
		{
			string SQLWhere = string.Empty;

			lvwRicerca.Items.Clear();
			ErrorProvider.SetError(btnRicerca, "");

			SQLWhere = ctlFiltro.GetWhere();

			AggiungiRecord(SQLWhere);

			if (lvwRicerca.SelectedItem != null)
				lvwRicerca.SelectedItem.Selected = false;
			base.OnFineRicerca();
		}

		#endregion


		#region GESTIONE CTL
		/// <summary>
		/// Gestione della propriet 'IDDirigente'
		/// </summary>
		[System.ComponentModel.Browsable(false)]
		public object IDDirigente
		{
			get
			{
				if (lvwRicerca.SelectedItem == null)
				{
					return DBNull.Value;
				}
				else
				{
					return Convert.ToInt32(KeyToID(lvwRicerca.SelectedItem.Key, 0));
				}
			}
		}

		/// <summary>
		/// Gestione della propriet 'IDRuoloDirigenteInGara'
		/// </summary>
		[System.ComponentModel.Browsable(false)]
		public object IDRuoloDirigenteInGara
		{
			get
			{
				if (lvwRicerca.SelectedItem == null)
				{
					return DBNull.Value;
				}
				else
				{
					return Convert.ToInt32(KeyToID(lvwRicerca.SelectedItem.Key, 1));
				}
			}
		}

		/// <summary>
		/// Gestione della propriet 'Casa'
		/// </summary>
		[System.ComponentModel.Browsable(false)]
		public object Casa
		{
			get
			{
				if (lvwRicerca.SelectedItem == null)
				{
					return DBNull.Value;
				}
				else
				{
					return KeyToID(lvwRicerca.SelectedItem.Key, 2);
				}
			}
		}

		/// <summary>
		/// Restituisce la parte di filtro della query
		/// </summary>
		/// <returns>Stringa rappresentante la parte di filtro della query</returns>
		public string GetWhere()
		{
			return ctlFiltro.GetWhere();
		}

		/// <summary>
		/// Esegue la ricerca
		/// </summary>
		override public void Refresh()
		{
			btnRicerca_OnClick(this, new EventArgs());
		}

		private void AggiungiRecord(string SQLWhere)
		{
			IDataReader tblRicerca;
			int N = 0;
			bool AlmenoUno;
			tblRicerca = RecuperaRecordset(SQLWhere);

			AlmenoUno = false;
			Cursor.Current = Cursors.WaitCursor;

			// Disabilito per il momento la visualizzazione degli elementi
			lvwRicerca.BeginUpdate();

			// Per ogni record (massimo MaxElementiInLista)
			while (tblRicerca.Read() & N < Globals.MaxElementiInLista)
			{
				AlmenoUno = true;

				base.AggiornaRecordInLista(tblRicerca, IDToKey(Convert.ToInt32(tblRicerca["IDDirigente"]), Convert.ToInt32(tblRicerca["IDRuoloDirigenteInGara"]), General.DBToBool(tblRicerca["Casa"])));
				N += 1;
			}

			// Ri-abilito la visualizzazione degli elementi
			lvwRicerca.EndUpdate();

			Cursor.Current = Cursors.Default;

			if (!AlmenoUno)
			{
				SetNumeroElementiTrovati(0);
				tblRicerca.Close();
				return;
			}

			if (tblRicerca.Read())
 			{
				ErrorProvider.SetError(btnRicerca, "Impossibile visualizzare tutti gli elementi nella lista. Definire ulteriori criteri di ricerca.");
			}

			SetNumeroElementiTrovati(N);
			tblRicerca.Close();
		}

		/// <summary>
		/// Elimina il record nella lista
		/// </summary>
		/// <param name="ID">Valori dei campi chiave che identificano il record da eliminare</param>
		public void Elimina(int IDDirigente, int IDRuoloDirigenteInGara, bool Casa)
		{
			base.InternalElimina(IDToKey(IDDirigente, IDRuoloDirigenteInGara, Casa));
			SetNumeroElementiTrovati(lvwRicerca.Items.Count);
		}

		/// <summary>
		/// Aggiunge il record alla lista
		/// </summary>
		/// <param name="ID">Valori dei campi chiave che identificano il record da aggiungere</param>
		public void Aggiungi(int IDDirigente, int IDRuoloDirigenteInGara, bool Casa)
		{
			base.InternalAggiungi(IDToSQLWhere(IDDirigente, IDRuoloDirigenteInGara, Casa), IDToKey(IDDirigente, IDRuoloDirigenteInGara, Casa));
			SetNumeroElementiTrovati(lvwRicerca.Items.Count);
		}

		/// <summary>
		/// Aggiunge il record alla lista
		/// </summary>
		/// <param name="ID">Valori dei campi chiave che identificano il record da aggiungere</param>
		public bool AggiungiSeEsiste(int IDDirigente, int IDRuoloDirigenteInGara, bool Casa)
		{
			return base.InternalAggiungiSeEsiste(IDToSQLWhere(IDDirigente, IDRuoloDirigenteInGara, Casa), IDToKey(IDDirigente, IDRuoloDirigenteInGara, Casa));
			SetNumeroElementiTrovati(lvwRicerca.Items.Count);
		}

		/// <summary>
		/// Modifica il record nella lista
		/// </summary>
		/// <param name="ID">Valori dei campi chiave che identificano il record da modificare</param>
		public void Modifica(int IDDirigente, int IDRuoloDirigenteInGara, bool Casa)
		{
			base.InternalModifica(IDToSQLWhere(IDDirigente, IDRuoloDirigenteInGara, Casa), IDToKey(IDDirigente, IDRuoloDirigenteInGara, Casa));
			SetNumeroElementiTrovati(lvwRicerca.Items.Count);
		}

		/// <summary>
		/// Imposta il record nella lista
		/// </summary>
		/// <param name="ID">Valori dei campi chiave che identificano il record da impostare come selezionato sulla lista</param>
		public void ImpostaElementoSelezionato(int IDDirigente, int IDRuoloDirigenteInGara, bool Casa)
		{
			base.InternalImpostaElementoSelezionato(IDToKey(IDDirigente, IDRuoloDirigenteInGara, Casa));
		}

		/// <summary>
		/// Abilita oppure disabilita il pulsante di inserimento modifica degli FK
		/// a seconda del valore del parametro
		/// </summary>
		/// <param name="Abilita">Indica se abilitare oppure no</param>
		public override void AbilitaDisabilitaAllowIns_fk(bool Abilita)
		{
			ctlFiltro.AbilitaDisabilitaAllowIns_fk(Abilita);
		}

		#endregion


		#region Codice per i campi che compongono la chiave della tabella

		/// <summary>
		/// Utilizza i parametri per restituire la stringa K~P1~P2...
		/// </summary>
		private string IDToKey(int IDDirigente, int IDRuoloDirigenteInGara, bool Casa)
		{
			string Chiave = string.Empty;

			Chiave += "~" + IDDirigente.ToString().Trim();
			Chiave += "~" + IDRuoloDirigenteInGara.ToString().Trim();
			Chiave += "~" + Casa.ToString().Trim();
 			// Tolgo il primo ~
			Chiave = Chiave.Substring(1);
			return "K" + Chiave;
		}

		/// <summary>
		/// Utilizza i parametri per restituire una condizione da utilizzare in una query
		/// </summary>
		private string IDToSQLWhere(int IDDirigente, int IDRuoloDirigenteInGara, bool Casa)
		{
			string SQL = string.Empty;

			SQL += "And DefaultDirigenti.IDDirigente = " + string.Format("{0:0}", IDDirigente.ToString().Trim()) + " ";
			SQL += "And DefaultDirigenti.IDRuoloDirigenteInGara = " + string.Format("{0:0}", IDRuoloDirigenteInGara.ToString().Trim()) + " ";
			
			if(!Casa)
			 SQL += "And (DefaultDirigenti.Casa is NULL or DefaultDirigenti.Casa = 0) ";
			else
			 SQL += "And (DefaultDirigenti.Casa is NOT NULL And DefaultDirigenti.Casa <> 0) ";
			
			// Tolgo il primo And
			SQL = SQL.Substring(4);
			return SQL;
 		}

		#endregion	

		#region Gestione Item Checked

		/// <summary>
		/// Propriet che imposta sulla lista la propriet CheckBoxes
		/// </summary>
		public bool CheckBoxes
		{
			get
			{
				return lvwRicerca.CheckBoxes;
 			}
 			set
			{
				lvwRicerca.CheckBoxes = value;
			}
		}

		/// <summary>
		/// Imposta a true il checkbox di tutti gli elementi caricati nella lista
		/// </summary>
		public void CheckAllItems()
		{
			// Se la propriet CheckBoxes della lvwRicerca  a True imposta a True tutti i CheckBox
			// altrimenti non fa nulla
			foreach (DataListViewItem Elemento in lvwRicerca.Items)
			{
				Elemento.Checked = true;
			}
		}

		/// <summary>
		/// Imposta a false il checkbox di tutti gli elementi caricati nella lista
		/// </summary>
		public void UnCheckAllItems()
		{
			// Se la propriet CheckBoxes della lvwRicerca  a True imposta a False tutti i CheckBox
			// altrimenti non fa nulla
			foreach (DataListViewItem Elemento in lvwRicerca.Items)
			{
				Elemento.Checked = false;
			}
		}

																																												
		/// <summary>
		/// Propriet che ritorna una stringa con gli elementi che hanno la Falg = true, pronta da essere usata in uno statement IN di una Query
		/// </summary>
		[System.ComponentModel.Browsable(false), System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] 
		public string CheckedItemsSQLWhere
		{
			get
			{
				string StringaAND = string.Empty;
				string StringaSQL = string.Empty;

				foreach (DataListViewItem Elemento in lvwRicerca.Items)
				{
					StringaAND = string.Empty;
					if (Elemento.Checked)
					{
						StringaAND += " And DefaultDirigenti.IDDirigente = " + string.Format("{0:0}", KeyToID(Elemento.Key, 0));  						StringaAND += " And DefaultDirigenti.IDRuoloDirigenteInGara = " + string.Format("{0:0}", KeyToID(Elemento.Key, 1));  
						StringaSQL += " Or (" + StringaAND.Substring(5) + ")";
					}
				}

				if (StringaSQL != string.Empty)
				{
					StringaSQL = "(" + StringaSQL.Substring(4) + ")";
				}

				return StringaSQL;
			}
		}

		/// <summary>
		/// Propriet che ritorna in un array gli elementi con la Flag = true / imposta sulla lista gli elementi arrivati in una array
		/// </summary>
		[System.ComponentModel.Browsable(false), System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] 
		public string[,] CheckedItemsArray
		{
			get
			{
				string[,] ArrayChiavi;
				string[,] ArrayPieno;
				int nElemento;

				// La prima cifra rappresenta il numero dei campi che compongono la chiave
				ArrayChiavi = new string[3, Globals.MaxElementiInLista];

				nElemento = 0;
				foreach (DataListViewItem Elemento in lvwRicerca.Items)
				{
					if (Elemento.Checked)
					{
						ArrayChiavi[0, nElemento] = KeyToID(Elemento.Key, 0).Trim();
						ArrayChiavi[1, nElemento] = KeyToID(Elemento.Key, 1).Trim();
						ArrayChiavi[2, nElemento] = KeyToID(Elemento.Key, 2).Trim();

						nElemento = nElemento + 1;
					}
				}

				if (nElemento != 0)
				{
					// Copio in un altro array solo le righe piene

					// La prima cifra rappresenta il numero dei campi che compongono la chiave
					ArrayPieno = new string[3, nElemento];

					for (int lnI = 0; lnI < nElemento; lnI++)
					{
						for (int lnJ = 0; lnJ < 3; lnJ++)
						{							// La prima cifra rappresenta il numero dei campi che compongono la chiave
							ArrayPieno[lnJ, lnI] = ArrayChiavi[lnJ, lnI];
						}
					}
				}
				else
				{
					ArrayPieno = null;
				}
				return ArrayPieno;
			}
			set
			{
				// Value deve essere un array (n, m) dove
				//    n  il numero dei campi che compongono la chiave
				//    m  il numero delle chiavi contenute nel vettore
				DataListViewItem Elemento;
				Array ValueArray;

				if (value == null)
				{
					return;
				}

				ValueArray = (Array)value;

				for (int nElemento = 0; nElemento <= ValueArray.GetUpperBound(1); nElemento++)
				{
					// Guardo se il record e' presente nella lista
 					try
					{
						Elemento = lvwRicerca.Items[IDToKey(Convert.ToInt32(ValueArray.GetValue(0, nElemento)), Convert.ToInt32(ValueArray.GetValue(1, nElemento)), General.DBToBool(ValueArray.GetValue(2, nElemento)))];
					}
					catch
					{
						Elemento = null;
					}

					if (Elemento != null)
					{
						// Se l'elemento e' presente
						Elemento.Checked = true;
					}
				}
			}
 		}

		#endregion


		#region Funzioni per il salvataggio e il ripristino dei criteri di filtro

		/// <summary>
		/// Serializza informazioni ed eventuali valori contenuti nei controlli presenti per i criteri di filtro
		/// </summary>
		/// <param name="serializer">Indica se deserializzare dal file xml oppure no</param>
		/// <param name="objectFolder">Cartella principale di serializzazione</param>
		/// <param name="key">Nome della chiave</param>
		public override void SalvataggioCriteriFiltro(ISettingsSerializer serializer, string objectFolder, string key)
		{
			base.SalvataggioCriteriFiltro(serializer, objectFolder, key);

			ctlFiltro.SalvataggioCriteriFiltro(serializer, objectFolder, key);
		}

		/// <summary>
		/// DeSerializza informazioni ed eventuali valori contenuti nei controlli presenti per i criteri di filtro
		/// </summary>
		/// <param name="serializer">Indica se deserializzare dal file xml oppure no</param>
		/// <param name="objectFolder">Cartella principale di serializzazione</param>
		/// <param name="key">Nome della chiave</param>
		public override void RipristinoCriteriFiltro(ISettingsSerializer serializer, string objectFolder, string key)
		{
			base.RipristinoCriteriFiltro(serializer, objectFolder, key);

			ctlFiltro.RipristinoCriteriFiltro(serializer, objectFolder, key);
		}

		#endregion

		protected override string OnWriteColumnValue(string columnName, string columnContent, IDataReader rs)
		{
			switch (columnContent.ToLower())
			{
				case "dirigente": return string.Format("{0} {1} ", rs["CognomeDirigente"], rs["NomeDirigente"]);
				case "ruolo": return string.Format("{0}", rs["RuoloDirigente"]);
				case "casa": return FunzioniDecodifica.DecodificaBool(General.DBToBool(rs["Casa"]));
			}
			
			return base.OnWriteColumnValue(columnName, columnContent, rs);
		}

	}
}

